#
# Copyright (C) 2018, 2020 Jeffery To
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#

ifeq ($(origin GO_INCLUDE_DIR),undefined)
  GO_INCLUDE_DIR:=$(dir $(lastword $(MAKEFILE_LIST)))
endif

include $(GO_INCLUDE_DIR)/golang-values.mk


# $(1) valid GOOS_GOARCH combinations
# $(2) go version id
define GoCompiler/Default/CheckHost
	$(if $(filter $(GO_HOST_OS_ARCH),$(1)),,$(error go-$(2) cannot be installed on $(GO_HOST_OS)/$(GO_HOST_ARCH)))
endef

# $(1) source go root
# $(2) destination prefix
# $(3) go version id
# $(4) additional environment variables (optional)
define GoCompiler/Default/Make
	( \
		cd $(1)/src ; \
		$(if $(2),GOROOT_FINAL=$(2)/lib/go-$(3)) \
		$(4) \
		$(BASH) make.bash --no-banner ; \
	)
endef

# $(1) destination prefix
# $(2) go version id
define GoCompiler/Default/Install/make-dirs
	$(INSTALL_DIR) $(1)/lib/go-$(2)
	$(INSTALL_DIR) $(1)/share/go-$(2)
endef

# $(1) source go root
# $(2) destination prefix
# $(3) go version id
# $(4) file/directory name
define GoCompiler/Default/Install/install-share-data
	$(CP) $(1)/$(4) $(2)/share/go-$(3)/
	$(LN) ../../share/go-$(3)/$(4) $(2)/lib/go-$(3)/
endef

# $(1) source go root
# $(2) destination prefix
# $(3) go version id
# $(4) GOOS_GOARCH
# $(5) install suffix (optional)
define GoCompiler/Default/Install/Bin
	$(call GoCompiler/Default/Install/make-dirs,$(2),$(3))

	$(call GoCompiler/Default/Install/install-share-data,$(1),$(2),$(3),api)

	$(INSTALL_DATA) -p $(1)/VERSION $(2)/lib/go-$(3)/

	for file in AUTHORS CONTRIBUTING.md CONTRIBUTORS LICENSE PATENTS README.md SECURITY.md; do \
		if [ -f $(1)/$$$$file ]; then \
			$(INSTALL_DATA) -p $(1)/$$$$file $(2)/share/go-$(3)/ ; \
		fi ; \
	done

	$(INSTALL_DIR) $(2)/lib/go-$(3)/bin

  ifeq ($(4),$(GO_HOST_OS_ARCH))
	$(INSTALL_BIN) -p $(1)/bin/* $(2)/lib/go-$(3)/bin/
  else
	$(INSTALL_BIN) -p $(1)/bin/$(4)/* $(2)/lib/go-$(3)/bin/
  endif

	$(INSTALL_DIR) $(2)/lib/go-$(3)/pkg
	$(CP) $(1)/pkg/$(4)$(if $(5),_$(5)) $(2)/lib/go-$(3)/pkg/

	$(INSTALL_DIR) $(2)/lib/go-$(3)/pkg/tool/$(4)
	$(INSTALL_BIN) -p $(1)/pkg/tool/$(4)/* $(2)/lib/go-$(3)/pkg/tool/$(4)/
endef

# $(1) destination prefix
# $(2) go version id
define GoCompiler/Default/Install/BinLinks
	$(INSTALL_DIR) $(1)/bin
	$(LN) ../lib/go-$(2)/bin/go $(1)/bin/go
	$(LN) ../lib/go-$(2)/bin/gofmt $(1)/bin/gofmt
endef

# $(1) source go root
# $(2) destination prefix
# $(3) go version id
define GoCompiler/Default/Install/Doc
	$(call GoCompiler/Default/Install/make-dirs,$(2),$(3))

	$(call GoCompiler/Default/Install/install-share-data,$(1),$(2),$(3),doc)
	$(call GoCompiler/Default/Install/install-share-data,$(1),$(2),$(3),favicon.ico)
	$(call GoCompiler/Default/Install/install-share-data,$(1),$(2),$(3),robots.txt)
endef

# $(1) source go root
# $(2) destination prefix
# $(3) go version id
define GoCompiler/Default/Install/Src
	$(call GoCompiler/Default/Install/make-dirs,$(2),$(3))

	$(call GoCompiler/Default/Install/install-share-data,$(1),$(2),$(3),lib)
	$(call GoCompiler/Default/Install/install-share-data,$(1),$(2),$(3),misc)
	$(call GoCompiler/Default/Install/install-share-data,$(1),$(2),$(3),src)
	$(call GoCompiler/Default/Install/install-share-data,$(1),$(2),$(3),test)

	$(FIND) \
		$(2)/share/go-$(3)/src/ \
		\! -type d -a \( -name '*.bat' -o -name '*.rc' \) \
		-delete

	if [ -d $(1)/pkg/include ]; then \
		$(INSTALL_DIR) $(2)/lib/go-$(3)/pkg ; \
		$(INSTALL_DIR) $(2)/share/go-$(3)/pkg ; \
		$(CP) $(1)/pkg/include $(2)/share/go-$(3)/pkg/ ; \
		$(LN) ../../../share/go-$(3)/pkg/include $(2)/lib/go-$(3)/pkg/ ; \
	fi
endef

# $(1) destination prefix
# $(2) go version id
define GoCompiler/Default/Uninstall
	rm -rf $(1)/lib/go-$(2)
	rm -rf $(1)/share/go-$(2)
endef

# $(1) destination prefix
define GoCompiler/Default/Uninstall/BinLinks
	rm -f $(1)/bin/go
	rm -f $(1)/bin/gofmt
endef


# $(1) profile name
# $(2) source go root
# $(3) destination prefix
# $(4) go version id
# $(5) GOOS_GOARCH
# $(6) install suffix (optional)
define GoCompiler/AddProfile

  # $$(1) valid GOOS_GOARCH combinations
  define GoCompiler/$(1)/CheckHost
	$$(call GoCompiler/Default/CheckHost,$$(1),$(4))
  endef

  # $$(1) additional environment variables (optional)
  define GoCompiler/$(1)/Make
	$$(call GoCompiler/Default/Make,$(2),$(3),$(4),$$(1))
  endef

  # $$(1) override install prefix (optional)
  define GoCompiler/$(1)/Install/Bin
	$$(call GoCompiler/Default/Install/Bin,$(2),$$(or $$(1),$(3)),$(4),$(5),$(6))
  endef

  # $$(1) override install prefix (optional)
  define GoCompiler/$(1)/Install/BinLinks
	$$(call GoCompiler/Default/Install/BinLinks,$$(or $$(1),$(3)),$(4))
  endef

  # $$(1) override install prefix (optional)
  define GoCompiler/$(1)/Install/Doc
	$$(call GoCompiler/Default/Install/Doc,$(2),$$(or $$(1),$(3)),$(4))
  endef

  # $$(1) override install prefix (optional)
  define GoCompiler/$(1)/Install/Src
	$$(call GoCompiler/Default/Install/Src,$(2),$$(or $$(1),$(3)),$(4))
  endef

  # $$(1) override install prefix (optional)
  define GoCompiler/$(1)/Uninstall
	$$(call GoCompiler/Default/Uninstall,$$(or $$(1),$(3)),$(4))
  endef

  # $$(1) override install prefix (optional)
  define GoCompiler/$(1)/Uninstall/BinLinks
	$$(call GoCompiler/Default/Uninstall/BinLinks,$$(or $$(1),$(3)))
  endef

endef
